"""
可以发现, 我们调用对象的属性和方法

看起来很像是 字典 的调用方式

不同的是字典是 dict['xx']

但字典的这种方式显然更加灵活, 因为 key 值可以填入一个变量来查找, 比如:
"""
# d = {'name': 'muzhou'}
# nameKey = 'name'
# print(d['name'])
# print(d[nameKey])
"""
但是对象都是 d.xx, 按照目前我们所学的知识, 无法通过 变量填入 的形式来获取/增加/删除某个值

所以我们需要学习 反射

反射就是通过字符串的形式去对象（模块）中操作（查找/获取/删除/添加）成员，一种基于字符串的事件驱动

反射有三个函数:

getattr, 通过字符串获取对象的属性/方法
setattr, 通过字符串给对象的属性/方法赋值
hasattr, 通过字符串来判断对象是否拥有某个属性/方法
"""


class TestObj:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def test(self):
        print("执行test方法")


def a():
    print("类外部方法")


xiaoyu = TestObj('小宇', 18)

print(getattr(xiaoyu, "name"))  # 获取对象属性/对象方法

test = getattr(xiaoyu, "test")  # 获取对象方法
test()
#
print(hasattr(xiaoyu, "adress"))  # 判断对象是否有对应的属性及方法,返回True或False
# name = getattr(xiaoyu, "name") if hasattr(xiaoyu, "name") else ""
#
# setattr(xiaoyu, "name", "winnie")  # 修改属性的值
# print(xiaoyu.name)
# setattr(xiaoyu, "test1", a)  # 修改方法
# xiaoyu.test1()
#
# print(xiaoyu.name)
# test1 = getattr(xiaoyu, "test1")  # 获取对象方法
# test1()
#
# print(xiaoyu.name)
# delattr(xiaoyu, "name")  # 删除指定的属性
# print(xiaoyu.name)  # 报错


class Human():
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

info = Human("muzhou", "male", 18)

res = input("请输入您想要获取的信息字段,有 name | sex | age, 多个字段,逗号隔开: ")

fieldList = res.split(',')

for field in fieldList:
    if hasattr(info, field):
        print(getattr(info, field))
    else:
        print("无此字段")


